-- @Author: 作者QQ377411161
-- @Date:   2021-11-09 01:10:05
-- @Last Modified by:   作者QQ381990860
-- @Last Modified time: 2022-06-19 23:38:42
--======================================================================--
-- @作者: QQ377411161
-- @创建时间:   2019-12-03 02:17:19
-- @Last Modified time: 2020-11-21 21:22:12
--======================================================================--
local 地图类 = class()
local tp,tps,hc
local 精灵类 = require("gge精灵类")()
local 路径类 = require("script/MAP/路径类")
local map = require("script/MAP/MAP")
local dtx = require("script/Resource/地图特效")
local function 排序(a,b)
    if a.坐标.y == b.坐标.y  then
       return a.id > b.id
    end
	return a.坐标.y < b.坐标.y


end
local h,l

function 地图类:初始化(根,根1)
	tp = 根
	tps = 根1
    self.开始位置   = 生成XY(1,1) --生成XY() 是GGE函数，生成的{x=0,y=0},而且重载了相加和相减
    self.结束位置   = 生成XY(1,1)
end
function 地图类:加载(文件,编号)
        for i,v in ipairs{"resource","JM.dll","ZY.dll","ZHS.dll",'WP.dll','WP1.dll',"smap.dll","JS.dll","sound.dll","sound1.dll","MAX.7z"} do
            CacheFile[v] ={}
        end
    if hc ~= 文件 then
        hc = 文件
       精灵类=nil
       dtx=nil
        精灵类 = require("gge精灵类")()
        dtx = require("script/Resource/地图特效")
        self.mapzz = {}
        self.增加 = {x=0,y=0,z=0}
        self.db=nil



        self.db = {}
        self.map=nil
        self.map = map(文件)
        self.宽度,self.高度,self.行数,self.列数 = self.map.Width,self.map.Height,self.map.MapRowNum,self.map.MapColNum
        self.寻路 =nil
        self.寻路 = 路径类.创建(hc,self.列数*16,self.行数*12,self.map:取障碍())
        self.传送tx = nil
        self.特效cw=nil
        self.传送tx = {}
        self.特效cw={}


        if  地图特效 then
        self.特效cw = 取传特效表(编号)
        end

        if #self.特效cw > 0   then
            for nw=1,#self.特效cw do
                if self.特效cw[nw]~=nil then
                    self.传送tx[nw] = dtx(self.特效cw[nw].x,self.特效cw[nw].y,self.特效cw[nw].切换,self.特效cw[nw].资源)
                end
            end
        end
    end
end
function 地图类:取地图宽高(地图)--超级合成旗

    self.map1 = map("Data/Dt/381990860"..地图..".dll")
    self.宽度,self.高度 = self.map1.Width,self.map1.Height
    local 宽高 = {k=self.宽度,g=self.高度}
    return 宽高
end

function 地图类:显示(pos,偏移,xx,yy,dt,pys1)
     sxb=nil

     mp = nil
     maps=nil

    local  sxb={}

    local mp = {}
    local maps = self.map
    local 主角位置1 = math.ceil(pos.x/320)
    local 主角位置2 = math.ceil(pos.y/240)
    local 开始位置1 = 主角位置1 - 4
    local 结束位置1 = 主角位置1 + 4
    local 开始位置2 = 主角位置2 - 4
    local 结束位置2 = 主角位置2 + 4
    if 结束位置1 > self.列数 then
        结束位置1 = self.列数
    end
    if 开始位置1 < 1 then
        开始位置1 = 1
        结束位置1 = 结束位置1 + 1
    end
    if 结束位置2 > self.行数 then
        结束位置2 = self.行数
    end
    if 开始位置2 < 1 then
        开始位置2 = 1
    end
    local id
    local zz
    for h = 开始位置2, 结束位置2 do
        for  l = 开始位置1, 结束位置1 do
            id = ((h-1)*self.列数+l)-1
            if self.db[id] == nil then
                self.db[id] = {{}}
                zz = maps:取附近遮罩(id)
                for i=1,#zz do
                    if self.mapzz[zz[i]] == nil then
                        self.mapzz[zz[i]] = 1
                        table.insert(self.db[id][1],{maps:取遮罩(zz[i])})
                    end
                end
                self.db[id][2] = {(l-1)*320,(h-1)*240}
                self.db[id][3] = #self.db[id][1]
                maps:取纹理(id)
                break
            end
        end
    end
    for h = 开始位置2, 结束位置2 do
        for  l = 开始位置1, 结束位置1 do
            id = ((h-1)*self.列数+l)-1
            if self.db[id] ~= nil then
                for i=1,#self.db[id][1] do
                    table.insert(mp,self.db[id][1][i])
                end
                精灵类:置纹理(maps.缓存[id])
                精灵类:显示(self.db[id][2][1]+偏移.x,self.db[id][2][2]+偏移.y)

            end
        end
    end
    if not tp.战斗中 then
        local cs
        if tp.第二场景开启 == false then
            tp.选中假人 = false
            local jr = tps.假人
            local ls = tps.临时NPC
            local rw = tps.场景人物
            sxb=tps.场景人物
            table.sort(sxb,排序)
            if tp.窗口.快捷技能栏:检查点(xx,yy) or tp.窗口.底图框:检查点(xx,yy) or tp.窗口.人物框:检查点(xx,yy) or tp.窗口.时辰:检查点(xx,yy) or tp.窗口.任务追踪:检查点(xx,yy) then---or tp.窗口.任务追踪:检查点(xx,yy) ------修复任务背景点击
                tp.禁止通行 = true
            end
            for n=1,#tps.传送 do
                tps.传送[n]:显示(dt,xx,yy,偏移)
            end
            for n=1,#jr do
                if jr[n] ~= nil then
                    jr[n]:更新(dt,xx,yy,偏移)
                end
            end



            for n=1,#ls do
                if ls[n] ~= nil then
                    ls[n]:更新(dt,xx,yy,偏移)
                    -- if ls[n].假人[ls[n].行为]:是否选中(xx,yy) and 引擎.鼠标弹起(0x1) then
                    --  print(ls[n].名称)
                 --    end
                end
            end

            if self.传送tx~=nil and 地图特效 then
                for n=1,#self.传送tx do
                    if self.特效cw[n]~=nil and self.特效cw[n].资源是否最上面 ~= 1  then
                        self.传送tx[n]:显示(dt,xx,yy,偏移)
                    end
                end
            end



            for n=1,#sxb do
                --  if  sxb[n].标识 or 取两点距离(tp.角色坐标,sxb[n].坐标)<=全局游戏宽度/2+80  then
                    sxb[n]:显示(dt,xx,yy,偏移)
                -- end
            end

        else
            --if tp.剧情处理.可视 and tp.剧情处理.显示方式 == 0 then
                if tp.第二场景.人物组 ~= nil then
                    table.sort(tp.第二场景.人物组,排序)
                    for i=1,#tp.第二场景.人物组 do
                        local v = tp.第二场景.人物组[i]
                        if v.出现特效 == nil then
                            tp.影子:显示(v.坐标 + tps.屏幕坐标)
                        end
                        v:显示(dt,xx,yy,tps.屏幕坐标)
                    end
                end
                if self.传送tx~=nil then
                    for n=1,#self.传送tx do
                        if self.特效cw[n]~=nil and self.特效cw[n].资源是否最上面 ~= 1 then
                            self.传送tx[n]:显示(dt,xx,yy,偏移)
                        end
                    end
                end
            --end
        end

        for i=1,#mp do
            精灵类:置纹理(mp[i][1])
            精灵类:显示(mp[i][2]+偏移.x,mp[i][3]+偏移.y)
        end
        if tp.第二场景.人物组 ~= nil then
            for i=1,#tp.第二场景.人物组 do
                local v = tp.第二场景.人物组[i]
                v.喊话:显示(v.坐标.x + tps.屏幕坐标.x,v.坐标.y + tps.屏幕坐标.y)
            end
        end
        if self.传送tx~=nil and 地图特效 then
            for n=1,#self.传送tx do
                if self.特效cw[n]~=nil and self.特效cw[n].资源是否最上面 == 1 then
                    self.传送tx[n]:显示(dt,xx,yy,偏移)
                end
            end
        end
        -- local xyx = math.ceil(tp.角色坐标.x - tps.滑屏.x)
        -- local xyy = math.ceil(tp.角色坐标.y - tps.滑屏.y)
        -- local xx = 1
        -- local yy = 1
        -- local pz = 120
        -- local mfx = math.abs(xyx)
        -- local mfy = math.abs(xyy)
        -- if xyx <= -pz or xyx >= pz and self.增加.x <= 0 then
        --  self.增加.x = mfx + 170
        -- end
        -- if xyy <= -pz or xyy >= pz and self.增加.y <= 0 then
        --  self.增加.y = mfy + 170
        -- end
        -- if self.增加.x ~= 0 then
        --  xx = self.增加.z
        --  self.增加.x = self.增加.x - 1
        --  if self.增加.x <= 0 then
        --      self.增加.x = 0
        --  end
        -- end
        -- if self.增加.y ~= 0 then
        --  yy = self.增加.z
        --  self.增加.y = self.增加.y - 1
        --  if self.增加.y <= 0 then
        --      self.增加.y = 0
        --  end
        -- end
        -- if xyx < 0 then
        --  xx = -xx
        -- end
        -- if xyy < 0 then
        --  yy = -yy
        -- end
        -- if (xyx < 0 and xyx > xx) or (xyx > 0 and xyx < xx) then
        --  xx = xyx
        -- end
        -- if (xyy < 0 and xyy > yy) or (xyy > 0 and xyy < yy) then
        --  yy = xyy
        -- end
        -- if xyx ~= 0 then
        --  tps.滑屏.x = math.floor(tps.滑屏.x + xx)
        -- end
        -- if xyy ~= 0 then
        --  tps.滑屏.y = math.floor(tps.滑屏.y + yy)
        -- end
        -- tps.屏幕坐标 = 取画面坐标(tps.滑屏.x,tps.滑屏.y,self.宽度,self.高度)
         tps.屏幕坐标 = 取画面坐标(tp.角色坐标.x,tp.角色坐标.y,self.宽度,self.高度)

    end
end
return 地图类;
